package rank

import (
	"GoServer/models"
	"GoServer/utils/debug"
	"context"
	"encoding/json"
	"fmt"
	"github.com/go-redis/redis/v8"
)

// / 更新游戏对局数据
func SyncGameRoundStatusInRedis(redisClient *redis.Client, data *models.SyncGameStatusData) error {

	gameRoundData, err := json.Marshal(data)
	if err != nil {
		debug.Logln(debug.Error, "解析回合数据失败", err)
		return err
	}
	// 使用 HSet 更新数据，如果字段不存在则插入
	err = redisClient.HSet(context.Background(), "room_round_data", data.RoomId, gameRoundData).Err()
	if err != nil {
		return fmt.Errorf("更新房间回合数据失败: %w", err)
	}

	debug.Logln(debug.Debug, "更新房间回合数据成功")
	return nil
}

// / 获取游戏对局数据
func GetRoomGameRoundStatus(redisClient *redis.Client, roomId string) (*models.SyncGameStatusData, error) {
	// 从 Redis 中获取数据
	tableName := "room_round_data"
	value, err := redisClient.HGet(context.Background(), tableName, roomId).Result()
	if err == redis.Nil {
		// 当 key 不存在时返回一个友好的错误
		return nil, fmt.Errorf("没有找到该该房间数据， 房间id: [%s]", roomId)
	} else if err != nil {
		return nil, fmt.Errorf("获取房间数据失败， 房间id: [%s] ", roomId)
	}

	// 反序列化 JSON 数据到 SyncGameStatusData 结构体
	var userInfo models.SyncGameStatusData
	err = json.Unmarshal([]byte(value), &userInfo)
	if err != nil {
		return nil, fmt.Errorf("redis 返回数据json 序列化失败: %w", err)
	}

	return &userInfo, nil
}

// 更新或插入某个玩家数据到 Redis
func UpdateUserInfoInRedis(redisClient *redis.Client, userInfo *models.UserInfoBasic) error {
	// 将用户信息序列化为 JSON
	playerData, err := json.Marshal(userInfo)
	if err != nil {
		debug.Logln(debug.Error, "解析当前玩家数据错误", err)
		return err
	}

	// 使用 HSet 更新数据，如果字段不存在则插入
	tableName := fmt.Sprintf("%s_%s", "round_user_data", userInfo.RoomId)
	err = redisClient.HSet(context.Background(), tableName, userInfo.PlayerId, playerData).Err()
	if err != nil {
		return fmt.Errorf("插入当前回合数据失败: %w", err)
	}

	debug.Logln(debug.Debug, "更新当前回合数据成功")
	return nil
}

// 从 Redis 获取某个玩家的数据
func GetUserInfoFromRedis(redisClient *redis.Client, roomId string, playerId string) (*models.UserInfoBasic, error) {
	// 从 Redis 中获取数据
	tableName := fmt.Sprintf("%s_%s", "round_user_data", roomId)
	value, err := redisClient.HGet(context.Background(), tableName, playerId).Result()
	if err == redis.Nil {
		// 当 key 不存在时返回一个友好的错误
		return nil, fmt.Errorf("没有找到该玩家数据， 房间id: [%s]  玩家id : [%s]", roomId, playerId)
	} else if err != nil {
		return nil, fmt.Errorf("取出玩家数据失败， 房间id: [%s]  玩家id : [%s]", roomId, playerId)
	}

	// 反序列化 JSON 数据到 UserInfoBasic 结构体
	var userInfo models.UserInfoBasic
	err = json.Unmarshal([]byte(value), &userInfo)
	if err != nil {
		return nil, fmt.Errorf("redis 返回数据json 序列化失败: %w", err)
	}

	return &userInfo, nil
}

// / 游戏开始，清空上局游戏数据
func ClearRoundUserInfo(rediss *redis.Client, roomId string) {
	tableName := fmt.Sprintf("%s_%s", "round_user_data", roomId)
	err := rediss.Del(context.Background(), tableName).Err()
	if err != nil {
		debug.Logln(debug.Error, "清空 上局游戏玩家 Redis 数据时出错:", err)
	} else {
		debug.Logln(debug.Info, "清空 上局游戏玩家 Redis 数据已清空")
	}
}
